﻿using System;
using System.Configuration;
using System.IO;
using System.Windows.Forms;
using System.Xml;

namespace BCS.SrvActivacion
{
    public class ConfigSettings
    {
        protected string m_Archivo;
        protected string m_Ruta;

        public string Archivo
        {
            get { return m_Ruta + @"\" + m_Archivo; }
        }

        public ConfigSettings (string ArchivoConfig , string RutaConfig)
        {
            m_Archivo = ArchivoConfig;
            m_Ruta = RutaConfig.EndsWith(@"\") ? RutaConfig.Substring(0, RutaConfig.Length - 1) : RutaConfig;

            try
            {
                if (!File.Exists(Archivo))
                {
                    m_Ruta = "";
                    m_Archivo = "";

                    throw new FileNotFoundException();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public ConfigSettings(string ArchivoConfig)
        {
            string[] Directorios = ArchivoConfig.Split(Convert.ToChar(@"\"));

            m_Archivo = Directorios[Directorios.Length - 1];
            m_Ruta = ArchivoConfig.Replace(m_Archivo, " ").Trim();

            try
            {
                if (!File.Exists(Archivo))
                {
                    m_Ruta = "";
                    m_Archivo = "";

                    throw new FileNotFoundException();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public string ReadSetting(string key)
        {
            return ConfigurationManager.AppSettings[key];
        }
    
        public void WriteSetting(string key, string value)
        {
            WriteSetting(Archivo, key, value);
        }

        public static void WriteSetting(string File, string key, string value)
        {
            var doc = loadConfigDocument(File);
            var node = doc.SelectSingleNode("//appSettings");

            if (node == null)
                throw new InvalidOperationException("appSettings section not found in config file.");

            try
            {
                var elem = node.SelectSingleNode(string.Format("//add[@key='{0}']", key)) as XmlElement;

                if (elem != null)
                    elem.SetAttribute("value", value);
                else
                {
                    elem = doc.CreateElement("add");
                    elem.SetAttribute("key", key);
                    elem.SetAttribute("value", value);
                    node.AppendChild(elem);
                }

                doc.Save(File);
            }
            catch (Exception)
            {
                throw;
            }
        }

        public void WriteConnectionStringSetting(string name, string value)
        {
            var doc = loadConfigDocument(Archivo);
            var node = doc.SelectSingleNode("//connectionStrings");

            if (node == null)
                throw new InvalidOperationException("connectionStrings section not found in config file.");

            try
            {
                var elem = node.SelectSingleNode(string.Format("//add[@name='{0}']", name)) as XmlElement;

                if (elem != null)
                    elem.SetAttribute("connectionString", value);
                else
                {
                    elem = doc.CreateElement("add");
                    elem.SetAttribute("name", name);
                    elem.SetAttribute("connectionString", value);
                    node.AppendChild(elem);
                }

                doc.Save(Archivo);
            }
            catch (Exception)
            {
                throw;
            }
        }

        public void RemoveSetting(string key)
        {
            RemoveSetting(Archivo, key);
        }

        private void RemoveSetting(string File, string key)
        {
            XmlDocument doc = loadConfigDocument(File);
            XmlNode node = doc.SelectSingleNode("//appSettings");

            try
            {
                if (node == null)
                    throw new InvalidOperationException("appSettings section not found in config file.");
                
                node.RemoveChild(node.SelectSingleNode(string.Format("//add[@key='{0}']", key)));
                doc.Save(Archivo);
            }
            catch (NullReferenceException ex)
            {
                throw new Exception(string.Format("The key {0} does not exist.", key), ex);
            }
        }

        private static XmlDocument loadConfigDocument(string File)
        {
            XmlDocument doc;

            try
            {
                doc = new XmlDocument();
                doc.Load(File);

                return doc;
            }
            catch (FileNotFoundException ex)
            {
                throw new Exception("No configuration file found.", ex);
            }

        }
    }
}